package com.pan.common.interview.thread;

/**
 * @author by panstark
 * @description
 * @notice
 * @date 2020/12/25
 */
public class ThreadInfo {

    /**
     * Thread中start 与run 方法的区别
     * start会启用新的线程，来跑
     * run会引入main线程，来跑，而不会新建线程
     */
    private static void attack() {
        System.out.println("Fight");
        System.out.println("Current Thread is : " + Thread.currentThread().getName());
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(){
            public void run(){
                attack();
            }
        };
        //run防止只会引用main方法，而不会创建新的线程
        t.run();
        System.out.println("current main thread is : " + Thread.currentThread().getName());
        //start方法其实是调用了jvm中创建线程的方法，启动了一个新的线程
        t.start();
    }

    /**
     * 线程的6个状态
     * 1、新建（new）：创建后，尚未启动的状态
     * 2、运行（runnable）：包含running和ready（等待时间片）
     * 3、无限等待状态（waiting）：不会被分配cpu时间，需要其他线程显示唤醒
     *    没有设置timeout参数的Object.wait()；
     *    没有设置timeout参数的thread.join();
     *    LockSupport.park()方法
     * 4、有限等待状态（timed waiting）：到了一定时间，自动唤醒
     *    Thread.sleep();
     *    设置timeout参数的Object.wait()；
     *    设置timeout参数的thread.join();
     *    lockSupport.parkNanos();
     *    lockSupport.partUntil();
     * 5、阻塞（blocked）：等待获取拍排他锁
     * 6、结束（terminated）：已终止线程的状态，县城已经结束执行
     */

    /**
     * sleep和wait方法
     *  区别：
     *  sleep是thread中的方法
     *  wait方法是object方法
     *
     *  sleep可以在任何方法使用
     *  wait只能在synchronize方法中使用
     *
     *  Thread.spleep方法只会让出cpu，不会导致锁行为的改变
     *  Object.wait不仅让出cpu，还会释放已经占用的同步锁的资源
     */

    /**
     * nofify与nofifyAll的区别
     * 锁池：线程没有抢到排它锁，线程就会进入锁池中，等待锁的释放
     * 等待池：线程A调用了wait方法，就是释放该对象锁，并进如等待池中，不会再去竞争该对象的锁，只能等待其他线程唤醒。
     *
     * nofifyAll让所有处于等待池的线程进入锁池去竞争锁
     * nofify：随机唤醒一个线程进入锁池
     *
     */

}
